#pragma once
#include <vector>
#include <string>
#include <Directory.h>
#include <File.h>
#include <AddrLinkedList.h>
#include <sstream>
using namespace std;

//指令管理类
class Instruction
{
public:
	Instruction();
	string execute(string  cmd);                //执行一条指令
	string ls(vector<string> args);             //ls命令  
	string cd(vector<string> args);             //cd命令
	string mkdir(vector<string> args);          //mkdir命令
	string rmdir(vector<string> args);          //rmdir命令
	string touch(vector<string> args);          //touch命令
	string rm(vector<string> args);             //rm命令
	string open(vector<string> args);           //open命令
	string create(vector<string> args);         //create命令
	string _import(vector<string> args);        //impoort命令
	string _export(vector<string> args);        //export命令，为了不与关键字export重名 
	string pwd(vector<string> args);
	string cat(vector<string> args);
	string df(vector<string> args);
	void checkEmpty();                          //检查是否已经打开了虚拟磁盘，即是否已经调用了open指令，如果没有，则抛出异常
	string getCurrentDirName();                 //得到当前目录
	//分割字符串
	static vector<string> split(string str, string pattern);
private:
	static string instrErrorMsg;                //指令错误信息
	static string nameIllegal;                  //文件名错误信息
	AddrLinkedList path;                        //当前路径栈（保存有从根目录开始到当前目录的所有目录）
	string disk;	                            //所打开的虚拟磁盘名字
};


//要实现的命令大全
//1.√ ls [.|..|/|subdir]  
//2.√ cd [.|..|/|subdir]  
//3.√ import from to
//4.√ export from to
//5.√ touch file
//6.√ rm file
//7.√ mkdir dir
//8.√ rmdir dir
//9.√ cat [-r] file        用来查看文本文件  如果有-r则表示往文件里写内容，文件可以不存在，存在则被覆盖
//10.√ exit
//11.√ create disk size
//12.√ open disk
//13.√ pwd
//14.√ df




